package jwr.basic;

import java.util.Scanner;

public class J09_Exception {

	public static void main(String[] args) throws Exception {
		// 예외 처리 - 일종의 오류
		
		// 프로그램상에서 오류(error)의 종류
		// 1. 컴파일오류(compile-time error)
		//    오타등의 잘못된 코드 작성이 원인
		//    개발자가 충분히 수습 가능
		
		// 2. 런타임오류(runtime-time error)
		//    프로그램 실행 시 발생하는 오류
		//    논리적 오류 (개발자 수습 가능), 
		//    잘못된 동작(개발자 수습 가능)이나 특별한 상황(개발자가 수습 불가능)이 원인
		
		// 따라서, 예외는 프로그램 실행 중 발생하는 오류를 개발자가 처리하기 위해
		// 작성하는 조칫하항을 의미
		// 이것을 통해 오류로 인한 프로그램 실행 중단을 막을 수 있다.
		
		// 예외 : checked exception
		//       unchecked exception
		
		// 상황1) 두 개의 정수를 입력받아 
		//       두수를 나눈 결과를 출력하는 프로그램
		// 예외처리 하지 않았을 경우
		
		int num1, num2, result;
		Scanner sc = new Scanner(System.in);
		
		/*System.out.println("두 수를 입력해주세요.");
		num1 = sc.nextInt();
		num2 = sc.nextInt();
		result = num1 / num2;
		System.out.println("두 수를 나눈 결과는 : "+result);*/
		//num2에 0이 입력되면 num1을 0으로 나눌수 없으므로 오류 발생
		
		/*System.out.println("두 수를 입력해주세요.");
		num1 = sc.nextInt();
		num2 = sc.nextInt();
		if(num1 ==0 || num2==0){
			System.out.println("0은 입력할 수 없습니다.");
		}else{
			result = num1 / num2;
			System.out.println("두 수를 나눈 결과는 : "+result);
		}*/
		
		// 오류가 발생할 조건을 if문으로 막음
		// 오류 발생 조건이 많을 경우 다중 if문을 사용해야 하는데
		// 그러면 코드가 복잡해 짐 
		
		/*System.out.println("두 수를 입력해주세요.");
		try{
			num1 = sc.nextInt();
			num2 = sc.nextInt();
			result = num1 / num2;
			System.out.println("두 수를 나눈 결과는 : "+result);
		}catch(Exception ex){
			System.out.println( "입력값은 숫자이고 0 초과 입니다." );
		}*/
		// 자바에서는 오류발생 시 예외(exception)처리 매커니즘을 사용
		// 오류가 발생할 가능성이 있는 코드를 
		// try - catch 블럭으로 지정고
		// catch에서 오류에 대한 조치사항을 작성
		
		/*System.out.println("두 수를 입력해주세요.");
		try{
			num1 = sc.nextInt();
			num2 = sc.nextInt();
		}catch(Exception ex){
			throw new Exception("입력이 잘못 되었습니다!");
			// 입력시 발생하는 예외를 각각의 catch 블럭에서 처리하지 않고
			// 한곳에 모아서 처리하기 위해 throw 라는 명령으로 예외를 다른 곳으로 넘김 
		}
		try{
			result = num1 / num2;
			System.out.println("두 수를 나눈 결과는 : "+result);
		}catch(Exception ex){
			throw new Exception("잘못된 연산을 시도했습니다.");	
		}*/
		//예외 던지기
		int waitTime = 30;
		try{
			System.out.println("Try block entered");
			if(waitTime > 30) throw new Exception("Over 30.");
			else if(waitTime < 30) throw new Exception("Under 30.");
			else System.out.println("No Exception");
			System.out.println("Leaving try block");
		}catch(Exception ex){
			System.out.println(ex.getMessage());
		}
		
	}

}
